#!/usr/bin/python3
"""
From: https://www.pynote.net/archives/2116
      如何使用@property装饰器

```
Python对象在本质上是没有私有成员的，用双下划线的方式定义的成员，也可以通过附加
类名的方式来访问。不过，这种奇怪的访问方式在编写代码时，应当被禁止。

使用一个下划线来暗示这是私有成员，也是一种方法， 不过没有强制力，修改的时候，
也没有任何约束。

Python提供了一个@property装饰器，可以更好地控制对对象成员的访问，也可以更好
地控制对对象成员的修改。
```
"""

import sys


class Test():
    def __init__(self):
        self.__foo = 'foo'
        self.__bar = 'bar'

    @property
    def foo(self):
        print('>>> running in foo function ...')
        return self.__foo

    @foo.setter
    def foo(self, foo_value):
        print('>>> running in foo.setter function ...')
        if foo_value < 100:
            pass
        else:
            self.__foo = foo_value

    @foo.deleter
    def foo(self):
        print('>>> running in foo.deleter function ...')
        if self.__foo > 200:
            self.__foo = 200


def main(argc, argv):
    t = Test()
    print(t.foo)

    t.foo = 99
    print(t.foo)

    t.foo = 123
    print(t.foo)

    t.foo = 234
    print(t.foo)

    del t.foo
    print(t.foo)

    return 0


if __name__ == '__main__':
    import debug; debug.init()
    sys.exit(main(len(sys.argv), sys.argv))
